/*
 * CatalogoGridProductos.java
 *
 * Created on 26 de octubre de 2006, 12:01 PM
 */

package inc.jmc.cyberboard.ui.ventas;
import inc.jmc.cyberboard.common.DefaultLookAndFeel;
import inc.jmc.cyberboard.common.NumFormat;
import inc.jmc.cyberboard.dao.Dao;
import inc.jmc.cyberboard.dao.ProductosDao;
import inc.jmc.cyberboard.entitybeans.Productos;
import inc.jmc.cyberboard.ui.PCTimers;
import inc.jmc.cyberboard.ui.ventas.common.VentasKeyboardListener;
import inc.jmc.cyberboard.ui.ventas.common.VentasTableModel;

import java.awt.Dimension;
import java.awt.event.InputEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

import org.apache.log4j.Logger;

/**
 *
 * @author  Juan Miguel Olguin Salguero
 */
public class CatalogoGridProductos extends javax.swing.JPanel {
    /**
	 * 
	 */
	private static final long serialVersionUID = -3191457567530259492L;
	static Logger logger = Logger.getLogger(CatalogoGridProductos.class.getName());
    /** Creates new form CatalogoGridProductos */
    VentasTableModel dtm=new VentasTableModel();
    ArrayList dataProducts=new ArrayList();
    VentasKeyboardListener keyListener = null;
    public static final Object[] header=new Object[]{"Nombre","Precio","Descripcion"};
    public static final int HEADER_NOMBRE     =0;
    public static final int HEADER_PRECIO     =1;
    public static final int HEADER_DESCRIPCION=2;
    public static final int HEADER_ASCENDENTE =0;
    public static final int HEADER_DESCENDENTE=1;
    VentasFrm frm;
    public CatalogoGridProductos(VentasFrm frm) {
        this.frm=frm;
        initComponents();
        
        
        
        //productosTable=new JTable(dtm);
        
        try{
            loadProductsBD();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            dtm=new VentasTableModel(new Object[][]{},
                header);
            this.updateTableUI();
        }
    }
    
    /**
     * Este metodo es invocado desde el metodo init de de este frame.<BR>
     * Carga todos los datos que se encuentran en la base de datos y los despleiga en el grid.<BR>
     * Tambien actualiza los botones de agregar y modificar.
     * @throws java.lang.Exception Lanza una excepcion de base de datos cuando se hace la consulta correspondiente.
     */
    public void loadProductsBD()throws Exception
    {
                ProductosDao recsDao=new ProductosDao();
                java.sql.Connection conn=Dao.getConnection();
                //java.util.ArrayList arry=recsDao.getAllProductos(conn);
                java.util.ArrayList arry=recsDao.getAllProductosWithIconsBeans(conn);
                conn.close();
                dtm=new VentasTableModel(new Object[][]{},
                header);
                for(int i=0;i<arry.size();++i)
                {
                    Productos record=(Productos)arry.get(i);
                    Vector recVector=new Vector();
                    recVector.add(record.getNombreCorto());
                    recVector.add(NumFormat.money(record.getPrecio()));
                    recVector.add(record.getDescripcion());
                    //recVector.add(record.getIdIcono());
                    recVector.add(record.getStock());
                    recVector.add(record);
                    dtm.addRow(recVector);
                    dataProducts=arry;
                    
                }
                this.updateTableUI();
    }
    /**
     * Con este metodo se garantiza que cualquier modificacion en los datos almacenados en el 
     * default table model, de la tabla, sean actualizados correctamente en el componente visual.<BR>
     * Si se agrega un elemento, si se borra, o se modifica sus atributos (o campos), esta tabla se tiene que actualizar.<BR>
     * Basicamente este metodo crea una nueva tabla, pone las cabeceras, y llena nuevamente los datos en el grid, sobre el viewport de la barra de scroll correspondiente
     * @param dtm Es el default table model que se ha acutalizado, y a partir del cual vamos a construir la nueva tabla visual que se debe ver en el grid.
     */
    private void updateTableUI()
    {
        productosTable=new JTable(dtm);
        productosTable.setDragEnabled(true);
        productosTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        jScrollPane1.setViewportView(productosTable);
        productosTable.setFont(DefaultLookAndFeel.TableFont);
        productosTable.setBackground(DefaultLookAndFeel.TableBackground);
        productosTable.setRowHeight(DefaultLookAndFeel.TableRowHeight);
        if(productosTable.getTableHeader()!=null)
          productosTable.getTableHeader().setReorderingAllowed(false);
        ///en caso de que haya al menos un elemento en el grid, ese lo seleccionamos 
        if(dtm.getRowCount()>0)
            this.productosTable.getSelectionModel().setSelectionInterval(0,0);
        productosTable.setColumnSelectionAllowed(false);
        
        productosTable.getColumnModel().getColumn(0).setWidth(208);
        productosTable.getColumnModel().getColumn(1).setWidth(70);
        productosTable.getColumnModel().getColumn(2).setWidth(140);
        productosTable.getColumnModel().getColumn(0).setPreferredWidth(208);
        productosTable.getColumnModel().getColumn(1).setPreferredWidth(70);
        productosTable.getColumnModel().getColumn(2).setPreferredWidth(140);
        productosTable.removeColumn(productosTable.getColumnModel().getColumn(2));
        
        this.setSeleccionListener();
        this.setKeyListener();
        this.setDoubleClicListener();
        
        DefaultTableCellRenderer precioRenderer = new DefaultTableCellRenderer();
        precioRenderer.setHorizontalAlignment(JLabel.RIGHT);
        TableColumn columnaPrecioAux=productosTable.getColumn(CatalogoGridProductos.header[CatalogoGridProductos.HEADER_PRECIO]);
        columnaPrecioAux.setCellRenderer(precioRenderer);
        productosTable.setIntercellSpacing(new Dimension(5, 2));
        
        
    }

    public JTable getProductosTable() {
        return productosTable;
    }
    
    private void setSeleccionListener()
    {
        MouseAdapter listMouseListener = new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
                TableColumnModel columnModel = productosTable.getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX()); 
                int column = productosTable.convertColumnIndexToModel(viewColumn); 
                if(e.getClickCount() == 1 && column != -1) {
                    int shiftPressed = e.getModifiers();
                    if((e.getModifiers()&InputEvent.BUTTON1_MASK)!=0)
                    {
                        cambiarOrdenamientoHeadClic(column);
                    }
                    
                }
             }
         };
        JTableHeader th = productosTable.getTableHeader(); 
        th.addMouseListener(listMouseListener);
    }
    private void setKeyListener()
    {
        keyListener = new VentasKeyboardListener(productosTable,dtm);
        KeyListener[] arryk=productosTable.getKeyListeners();
        for(int i=0;i<arryk.length;++i)
            productosTable.removeKeyListener(arryk[i]);
        productosTable.addKeyListener(keyListener);
    
    }
    private void setDoubleClicListener()
    {
    	productosTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                productosTableMouseClicked(evt);
            }
        });
        //JTableHeader th = productosTable.getTableHeader(); 
        //th.addMouseListener(listMouseListener);
    }
    
    protected void cambiarOrdenamientoHeadClic(int columnaAfectada)
    {
        int ascndx=frm.getAscendenteCmb().getSelectedIndex();
        int cmpndx=frm.getCampoOrdenarCmb().getSelectedIndex();
        if(columnaAfectada==cmpndx)
        {
            ascndx=(ascndx+1)%2;
            frm.getAscendenteCmb().setSelectedIndex(ascndx);
        
        }
        else
        {
            frm.getCampoOrdenarCmb().setSelectedIndex(columnaAfectada);
        }
    }
    void ordenamientoClic()
    {                                                 

        ///recuperamos el elemento por el que vamos a ordenar
        //logger.info("Entramos al combo de la lista");
        int ndx=frm.getCampoOrdenarCmb().getSelectedIndex();
        inc.jmc.cyberboard.common.TableSortedModel sort=new inc.jmc.cyberboard.common.TableSortedModel(dtm);
        try{
            dtm=sort.sortModel_usingDB(ndx,frm.getAscendenteCmb().getSelectedIndex()==0?true:false,true);
            this.updateTableUI();
            ///obtenemos lso beans completos, haciendo nuevamente la consulta
            dataProducts=sort.getSortedProductosBean(ndx,frm.getAscendenteCmb().getSelectedIndex()==0?true:false);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        
    }
    public ArrayList getSelectedItems()
    {
    	int[] ndxselected=this.productosTable.getSelectedRows();
        ArrayList arryret=new ArrayList ();
        for(int i=0;i<ndxselected.length;++i)
        {
            arryret.add(this.dataProducts.get(ndxselected[i]));
        }
        logger.info("se seleccionaron "+arryret.size()+" elementos de la tabla de productos");
        logger.info(""+arryret);
        return arryret;
    }
    public void setSelectedItems(int ndx)
    {
    	this.productosTable.getSelectionModel().setSelectionInterval(ndx, ndx);
    	
    }
    public ArrayList<Productos> getPCTIME10001()
    {
    	int size1=this.dataProducts.size();
    	ArrayList<Productos> arryret=new ArrayList<Productos> ();
    	for (int i = 0; i < size1; i++) {
    		Productos prod1=(Productos)this.dataProducts.get(i);
    		if(PCTimers.PCTIME10001.equalsIgnoreCase(prod1.getNombreCorto()))
    		{
    			Productos prodNuevo=new Productos(prod1);
    			arryret.add(prodNuevo);
    		}
		}
    	return arryret;
    }
    

    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        productosTable = new javax.swing.JTable();

        setLayout(new java.awt.BorderLayout());

        productosTable.setBackground(new java.awt.Color(238, 253, 255));
        productosTable.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        productosTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        productosTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                productosTableMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(productosTable);

        add(jScrollPane1, java.awt.BorderLayout.CENTER);
    }// </editor-fold>//GEN-END:initComponents

    private void productosTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_productosTableMouseClicked
        if (evt.getClickCount() == 2) {
         ArrayList selectedItems = this.getSelectedItems();
         this.frm.addFromCatalogoGridProductos(selectedItems);
         }
    }//GEN-LAST:event_productosTableMouseClicked
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable productosTable;
    // End of variables declaration//GEN-END:variables
    
}






























//int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK; 
                    //boolean ascending = (shiftPressed == 0); 
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.ALT_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.ALT_GRAPH_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.ALT_GRAPH_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.ALT_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.BUTTON1_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.BUTTON1_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.BUTTON2_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.BUTTON2_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.BUTTON3_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.BUTTON3_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.CTRL_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.CTRL_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.META_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.META_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.SHIFT_DOWN_MASK));
                    //logger.info(""+Integer.toBinaryString(shiftPressed)+"&"+Integer.toBinaryString(InputEvent.SHIFT_MASK));

                    //if((shiftPressed&InputEvent.ALT_DOWN_MASK)!=0)logger.info("clic mouse=ALT_DOWN_MASK");
                    //if((shiftPressed&InputEvent.ALT_GRAPH_DOWN_MASK)!=0)logger.info("clic mouse=ALT_GRAPH_DOWN_MASK");
                    //if((shiftPressed&InputEvent.ALT_GRAPH_MASK)!=0)logger.info("clic mouse=ALT_GRAPH_MASK");
                    //if((shiftPressed&InputEvent.ALT_MASK)!=0)logger.info("clic mouse=ALT_MASK");
                    //if((shiftPressed&InputEvent.BUTTON1_DOWN_MASK)!=0)logger.info("clic mouse=BUTTON1_DOWN_MASK");
                    //if((shiftPressed&InputEvent.BUTTON1_MASK)!=0)logger.info("clic mouse=BUTTON1_MASK");
                    //if((shiftPressed&InputEvent.BUTTON2_DOWN_MASK)!=0)logger.info("clic mouse=BUTTON2_DOWN_MASK");
                    //if((shiftPressed&InputEvent.BUTTON2_MASK)!=0)logger.info("clic mouse=BUTTON2_MASK");
                    //if((shiftPressed&InputEvent.BUTTON3_DOWN_MASK)!=0)logger.info("clic mouse=BUTTON3_DOWN_MASK");
                    //if((shiftPressed&InputEvent.BUTTON3_MASK)!=0)logger.info("clic mouse=BUTTON3_MASK");
                    //if((shiftPressed&InputEvent.CTRL_DOWN_MASK)!=0)logger.info("clic mouse=CTRL_DOWN_MASK");
                    //if((shiftPressed&InputEvent.CTRL_MASK)!=0)logger.info("clic mouse=CTRL_MASK");
                    //if((shiftPressed&InputEvent.META_DOWN_MASK)!=0)logger.info("clic mouse=META_DOWN_MASK");
                    //if((shiftPressed&InputEvent.META_MASK)!=0)logger.info("clic mouse=META_MASK");
                    //if((shiftPressed&InputEvent.SHIFT_DOWN_MASK)!=0)logger.info("clic mouse=SHIFT_DOWN_MASK");
                    //if((shiftPressed&InputEvent.SHIFT_MASK)!=0)logger.info("clic mouse=SHIFT_MASK");